package com.realtyreg.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.realtyreg.common.exception.ResourceNotFoundException;
import com.realtyreg.domain.entity.message.Message;
import com.realtyreg.domain.entity.users.User;
import com.realtyreg.repository.MessageRepository;
import com.realtyreg.service.util.SecurityUtil;

import java.security.AccessControlException;
import java.util.List;

/**
 * Created by Petro 17.03.13 22:51
 */
@Service("messageService")
@Repository
@Transactional(rollbackFor = java.lang.Exception.class)
public class MessageServiceImpl implements MessageService{
    @Autowired
    MessageRepository messageRepository;

    public List<Message> getInboxList() {
        User user = SecurityUtil.getUser();
        return messageRepository.findByReceiverAndReceiverDelFalseOrderBySendDateDesc(user);
    }

    public List<Message> getSentList() {
        User user = SecurityUtil.getUser();
        return messageRepository.findBySenderAndSenderDelFalseOrderBySendDateDesc(user);
    }

    public void send(Message message) {
        messageRepository.save(message);
    }

    public Message findById(Long id) {
        User user = SecurityUtil.getUser();
        Message message = messageRepository.findOne(id);
        if (message == null)
            throw new ResourceNotFoundException(String.format("Попытка получить несуществующее сообщение. User: %s. MessageId: %s.", user, id));
        if (!message.getSender().equals(user) && !message.getReceiver().equals(user))
            throw new AccessControlException(String.format("Попытка получить чужое сообщение. User: %s. MessageId: %s.", user, id));
        return message;
    }

    public void delete(Long id) {
        User user = SecurityUtil.getUser();
        Message message = messageRepository.findOne(id);
        if (message == null)
            throw new ResourceNotFoundException(String.format("Попытка удалить несуществующее сообщение. User: %s. MessageId: %s.", user, id));

        if (message.getSender().getId().equals(user.getId()))
            message.setSenderDel(true);
        else if (message.getReceiver().getId().equals(user.getId()))
            message.setReceiverDel(true);
        else
            throw new AccessControlException(String.format("Попытка удалить чужое сообщение (юзер не является ни отправителем, ни получателем). User: %s. MessageId: %s.", user, id));

        if (message.isSenderDel() && message.isReceiverDel())
            messageRepository.delete(id);
        else
            messageRepository.save(message);
    }
}
